package logicaJogo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Jogador implements Serializable {

    private String nome;
    private List<Carta> mao = new ArrayList();
    private Carta[][] construidas = new Carta[5][];
    private Carta[] em_construcao = new Carta[5];
    private int[] progresso = {0, 0, 0, 0, 0};
    private int[] recursos = {0, 0, 0, 0, 0, 0};
    private int[] opcoesRecursos = new int[6];

    public Jogador(String n, List<Carta> m) {
        nome = n;
        mao = m;
    }

    public void adicionarCartaMao(Carta c) {
        mao.add(c);
    }

    public void retirarCartaMao(Carta c) {
        mao.remove(c);
    }

    public void taxacao(int pos_naipe) {
        if (recursos[pos_naipe - 1] > 1) {
            recursos[pos_naipe - 1] = 1;
        }
    }

    public void acrescentarRecurso(int pos_naipe) {
        recursos[pos_naipe - 1]++;
    }

    public void retirarRecursos(int pos_naipe, int n) {
        recursos[pos_naipe - 1] -= n;
    }

    public void trocarRecurso(int pos_naipe1, int pos_naipe2) {
        recursos[pos_naipe1 - 1] -= 3;
        recursos[pos_naipe2 - 1]++;
    }

    public void setEmConstrucao(int pos, Carta c) {
        em_construcao[pos - 1] = c;
    }

    public void setConstruidas(int pos, Carta c) {
        if (construidas[pos - 1] == null) {
            construidas[pos - 1] = new Carta[1];
            construidas[pos - 1][0] = c;
        } else {
            int i;
            Carta[] aux = new Carta[construidas[pos - 1].length + 1];

            for (i = 0; i < construidas[pos - 1].length; i++) {
                aux[i] = construidas[pos - 1][i];
            }
            aux[i] = c;
            construidas[pos - 1] = aux;
        }
    }

    public void setOpcoesRecursos(Carta c, int tipo) {
        for (int i = 0; i < 6; i++) {
            opcoesRecursos[i] = 0;
        }

        if (tipo == 1) //escolher/receber
        {
            for (int i = 0; i < c.getNaipes().size(); i++) {
                opcoesRecursos[c.getNaipes().get(i).getPos() - 1] = 1;
            }
        }
        if (tipo == 2) //colocar/gastar
        {
            for (int i = 0; i < c.getNaipes().size(); i++) {
                if (recursos[c.getNaipes().get(i).getPos() - 1] > 0) {
                    opcoesRecursos[c.getNaipes().get(i).getPos() - 1] = 1;
                }
            }
        }
    }

    public void setOpcoesRecursoTroca(int escolha) {
        for (int i = 0; i < recursos.length; i++) {
            if (i == escolha - 1) {
                opcoesRecursos[i] = 0;
            } else {
                opcoesRecursos[i] = 1;
            }
        }
    }

    public void setOpcoesRecursosTroca() {
        for (int i = 0; i < recursos.length; i++) {
            if (recursos[i] >= 3) {
                opcoesRecursos[i] = 1;
            } else {
                opcoesRecursos[i] = 0;
            }
        }
    }

    public void setProgresso(int pos) {
        progresso[pos - 1]++;
    }

    public void limparProgresso(int pos) {
        progresso[pos - 1] = 0;
    }

    public String toString() {
        return nome;
    }

    public List<Carta> getCartas() {
        return mao;
    }

    public Carta[] getEmConstrucao() {
        return em_construcao;
    }

    public Carta[][] getConstruidas() {
        return construidas;
    }

    public int[] getRecursos() {
        return recursos;
    }

    public int[] getOpcoesRecursos() {
        return opcoesRecursos;
    }

    public boolean getPossivelAvancarConstrucao(int escolha) {
        for (int i = 0; i < em_construcao[escolha].getNaipes().size(); i++) {
            if (recursos[em_construcao[escolha].getNaipes().get(i).getPos() - 1] > 0) {
                return true;
            }
        }
        return false;
    }

    public int[] getOpcoesCarta(int tipo) {
        int[] opcoes = new int[3];
        int j, valor, soma;

        if (tipo == 1) //construir
        {
            for (int i = 0; i < 3; i++) {
                valor = mao.get(i).getValor();
                if (valor == 1) {
                    valor = 3;
                }
                soma = 0;
                for (j = 0; j < mao.get(i).getNaipes().size(); j++) {
                    if (recursos[mao.get(i).getNaipes().get(j).getPos() - 1] <= 0) {
                        break;
                    } else {
                        soma += recursos[mao.get(i).getNaipes().get(j).getPos() - 1];
                    }
                }

                if (j == mao.get(i).getNaipes().size() && soma >= valor) {
                    opcoes[i] = 1;
                } else {
                    opcoes[i] = 0;
                }
            }
        }
        if (tipo == 2) //adquirir
        {
            for (int i = 0; i < 3; i++) {
                for (j = 0; j < mao.get(i).getNaipes().size(); j++) {
                    if (recursos[mao.get(i).getNaipes().get(j).getPos() - 1] <= 0) {
                        break;
                    }
                }
                if (j == mao.get(i).getNaipes().size()) {
                    opcoes[i] = 1;
                } else {
                    opcoes[i] = 0;
                }
            }
        }
        if (tipo == 3) //avancar
        {
            opcoes = new int[5];
            for (int i = 0; i < 5; i++) {
                if (em_construcao[i] == null) {
                    opcoes[i] = 0;
                } else {
                    opcoes[i] = 1;
                }
            }
        }
        return opcoes;
    }

    public int[] getPontuacao() {
        int[] pontuacoes = {0, 0, 0, 0, 0};
        List<Carta> ases = new ArrayList();
        int numero_cartas;

        for (int i = 0; i < construidas.length; i++) {
            if (construidas[i] != null) {
                for (int j = 0; j < construidas[i].length; j++) {
                    if (construidas[i][j].getValor() == 1) {
                        ases.add(construidas[i][j]);
                    } else {
                        pontuacoes[i] += construidas[i][j].getValor();
                    }
                }
                numero_cartas = 0;
                for (int j = 0; j < construidas[i].length; j++) {
                    for (int k = 0; k < ases.size(); k++) {
                        for (int m = 0; m < construidas[i][j].getNaipes().size(); m++) {
                            if (construidas[i][j].getNaipes().get(m) == ases.get(k).getNaipes().get(0)) {
                                numero_cartas++; //mais uma carta no distrito com o mesmo naipe de um ás tambem nele presente
                            }
                        }
                    }
                }
                pontuacoes[i] += numero_cartas;
                ases.clear();
            }
        }
        return pontuacoes;
    }

    public int getProgresso(int pos) {
        return progresso[pos - 1];
    }
}
